//除类装饰器外,其余装饰器的target都指向被装饰者的原型对象

//类装饰器
// const doc: ClassDecorator = (target: any) => {
//   console.log(target);
// };

// @doc
// class Dzx {
//   constructor() {}
// }

//  或者向下兼容的函数写法   doc(Dzx)

// const dzx = new Dzx();

//属性装饰器
// const doc: PropertyDecorator = (target: any, key: string | symbol) => {
//   console.log(target, key);
// };

// class Dzx {
//   @doc
//   public name: string;

//   constructor(name: string) {
//     this.name = name;
//   }
// }

// const dzx = new Dzx("dzx");

//方法装饰器
// const doc: MethodDecorator = (
//   target: any,
//   key: string | symbol,
//   descriptor: any
// ) => {
//   console.log(target, key, descriptor);
// };

// class Dzx {
//   public name: string;

//   constructor(name: string) {
//     this.name = name;
//   }

//   @doc
//   get() {
//     return this.name;
//   }
// }

// const dzx = new Dzx("dzx");

//参数装饰器
const doc: ParameterDecorator = (
  target: any,
  key: string | symbol,
  ParameterDecorator: number
) => {
  console.log(target, key, ParameterDecorator);
  // target.prototype.age = "123";
  // console.log(target);
};

class Dzx {
  public name: string;

  constructor(name: string) {
    this.name = name;
  }

  show(@doc age: number) {
    console.log(age);
  }
}

const dzx = new Dzx("dzx");
